package com.wnxy.article.interceptor;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    //private static final Logger log = LoggerFactory.getLogger(LoginInterceptor.class);
    /**
     * 预处理方法
     * 1、处理请求之前执行
     * 2、返回true表示放行，可以执行控制器方法
     * 3、返回false表示不放行
     */
    @Override
    public boolean preHandle(
            HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        log.info("1、preHandle()");

        /* 需求： 请求头中必须携带token，才可以访问控制器 */
        String token = request.getHeader("token");
        log.info("token:",token);

        if (StringUtils.isEmpty(token)) {
            // 校验失败，返回错误提示(json字符串)

            Map<String,Object> map = new HashMap<>();
            map.put("code",500);
            map.put("message","请求头中未携带token，校验失败！");

            // 对象转换为json
            String mapJson = new ObjectMapper().writeValueAsString(map);

            // 把json字符串写入response流
            response.setCharacterEncoding("UTF-8");
            response.getWriter().write(mapJson);
            // 校验失败，返回false
            return false;
        }

        // 校验成功
        return true;
    }

    /**
     * postHandle()
     * 1、执行完控制器方法之后执行
     * 2、如果控制器方法有异常，不执行
     */
    @Override
    public void postHandle(
            HttpServletRequest request,
            HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("3、postHandle()");
    }

    /**
     * afterCompletion()
     * 1、最终最后执行的方法
     * 2、不管控制器方法是否有异常，都执行   finally
     */
    @Override
    public void afterCompletion(
            HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("4、afterCompletion()");
    }
}
